package com.tony.juc;

import java.util.concurrent.*;

/**
 * Created with IntelliJ IDEA.
 *
 * @Title: RecursiveTaskDemo001
 * @Auther: 皮蛋布丁
 * @Date: 2022/04/16/21:41
 * @Description: 延迟队列
 */
public class DelayQueueDemo001 {

    public static void main(String[] args) throws InterruptedException {

        BlockingQueue<DelayQueueEmployee> queue = new DelayQueue<>(); //获取延迟队列
        queue.put(new DelayQueueEmployee("张三老师","图书编辑创作",5,TimeUnit.SECONDS));
        queue.put(new DelayQueueEmployee("李四老师","视频后期剪辑",2,TimeUnit.SECONDS));
        queue.put(new DelayQueueEmployee("王五老师","少儿编程",3,TimeUnit.SECONDS));
        //所有的延迟队列到点之后可以自动的弹出，那么下面就需要等待这些弹出的数据内容
        while (!queue.isEmpty()) {
            DelayQueueEmployee employee = queue.take();//获取超时的数据
            System.out.println(employee);
            TimeUnit.SECONDS.sleep(1); //慢一些获取
        }

    }

}
/**
* @Description: Delayed属于Comparable子接口，那么在子类里面自然需要进行两个父接口方法的覆写
* @Param:
* @return:
* @Author: 皮蛋布丁
* @Date: 2022/4/16 21:56
*/
class DelayQueueEmployee implements Delayed { //定义延迟队列项

    private String name; //雇员姓名
    private String task; //雇员任务
    private long start = System.currentTimeMillis(); //根据当前的时间来计算
    //每个雇员的任务不同，那么所完成任务耗费的时间也不一定相同，delay就是存储耗时
    private long delay; //延迟的时间
    //传入的时间单元可能是秒、分，但是最终存储的时间一定是毫秒，这里面就需要进行转换
    public DelayQueueEmployee(String name, String task, long delay,TimeUnit timeUnit) {
        this.name = name;
        this.task = task;
        this.delay = TimeUnit.MILLISECONDS.convert(delay,timeUnit);
    }

    @Override
    public long getDelay(TimeUnit unit) {
        //延迟的计算
        return unit.convert((this.start + this.delay) - System.currentTimeMillis(),TimeUnit.MILLISECONDS);
    }

    @Override
    public int compareTo(Delayed o) {
        //延迟队列的内部存在优先级队列
        return (int) (this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS));
    }

    @Override
    public String toString() {
        return "【任务完成】，雇员" + this.name + ",完成了”" + this.task + "“工作，一共花费了”" + this.delay + "”毫秒的时间";
    }
}